package ec.linde.modulos.proyectos.servicio.impl;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import ec.linde.enumeraciones.Estado;
import ec.linde.modulos.dao.DetallePlanillaContratistaDao;
import ec.linde.modulos.dao.PlanillaContratistaDao;
import ec.linde.modulos.proyectos.servicio.ServicioPlanillaContratista;
import ec.linde.persistencia.entidades.ProdConceptos;
import ec.linde.persistencia.entidades.ProdPartidaDetalle;
import ec.linde.persistencia.entidades.proyectos.DetallePlanillaContratista;
import ec.linde.persistencia.entidades.proyectos.PlanillaContratista;
import ec.linde.persistencia.entidades.proyectos.Rdo;

/**
 * TODO: Agregar descripcion
 * 
 * @FechaCreacion: 29/09/2014
 * @author: Alex Carrillo
 * @FechaModificacion: 29/09/2014
 * @author: Alex Carrillo
 * @version: 1.0
 */
@Stateless
public class ServicioPlanillaContratistaImpl implements ServicioPlanillaContratista {

	@EJB
	private PlanillaContratistaDao planillaContratistaDao;
	@EJB
	private DetallePlanillaContratistaDao detallePlanillaContratistaDao;

	/*
	 * (non-Javadoc)
	 * 
	 * @see ec.linde.modulos.proyectos.servicio.ServicioProdProyecto#guardar(ec.linde .persistencia.entidades.proyectos.ProdProyecto)
	 */
	@Override
	public void guardar(PlanillaContratista planillaContratista) {
		for (DetallePlanillaContratista detallePlanillaContratista : planillaContratista.getListaDetallePlanillaContratista()) {
			detallePlanillaContratistaDao.guardar(detallePlanillaContratista);
		}
		planillaContratistaDao.guardar(planillaContratista);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see ec.linde.modulos.proyectos.servicio.ServicioProdProyecto#eliminar(ec. linde.persistencia.entidades.proyectos.ProdProyecto)
	 */
	@Override
	public void eliminar(PlanillaContratista planillaContratista) {
		planillaContratistaDao.eliminar(planillaContratista);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see ec.linde.modulos.proyectos.servicio.ServicioProdProyecto#buscarPorId(int)
	 */
	@Override
	public PlanillaContratista buscarPorId(int proyId) {
		return planillaContratistaDao.buscarPorId(proyId);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see ec.linde.modulos.proyectos.servicio.ServicioProdProyecto# obtenerListaPorPagina(int, int, java.lang.String, boolean, java.util.Map)
	 */
	@Override
	public List<PlanillaContratista> obtenerListaPorPagina(int startIndex, int pageSize, String sortField, boolean sortOrder,
			Map<String, String> filters) {
		return planillaContratistaDao.obtenerListaPorPagina(startIndex, pageSize, sortField, sortOrder, filters);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see ec.linde.modulos.proyectos.servicio.ServicioProdProyecto#obtenerListaCombo (java.lang.String, boolean, java.util.Map)
	 */
	@Override
	public List<PlanillaContratista> obtenerListaCombo(String sortField, boolean sortOrder, Map<String, String> filters) {
		return planillaContratistaDao.obtenerListaCombo(sortField, sortOrder, filters);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see ec.linde.modulos.proyectos.servicio.ServicioProdProyecto#contarPorCriterio (java.util.Map)
	 */
	@Override
	public int contarPorCriterio(Map<String, String> filters) {
		return planillaContratistaDao.contarPorCriterio(filters);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see ec.linde.modulos.proyectos.servicio.ServicioProdProyecto#cargarDetalle (int)
	 */
	@Override
	public PlanillaContratista cargarDetalle(int proyId) {
		return planillaContratistaDao.cargarDetalle(proyId);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see ec.linde.modulos.proyectos.servicio.ServicioPlanOperativo#cambiarEstado(int, ec.linde.enumeraciones.Estado)
	 */
	@Override
	public void cambiarEstado(int idPlanillaContratista, Estado estado) {
		planillaContratistaDao.cambiarEstado(idPlanillaContratista, estado);

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see ec.linde.modulos.proyectos.servicio.ServicioPlanillaContratista#totalizar(ec.linde.persistencia.entidades.proyectos.PlanillaContratista)
	 */
	@Override
	public void totalizar(PlanillaContratista planillaContratista) {

		BigDecimal subtotalCostoTotal = BigDecimal.ZERO;
		BigDecimal porcentajeImpuesto = planillaContratista.getPorcentajeImpuesto();
		BigDecimal impuestoCostoTotal = BigDecimal.ZERO;

		BigDecimal subtotalCostoActual = BigDecimal.ZERO;
		BigDecimal impuestoCostoActual = BigDecimal.ZERO;

		BigDecimal subtotalCostoAnterior = BigDecimal.ZERO;
		BigDecimal impuestoCostoAnterior = BigDecimal.ZERO;

		BigDecimal subtotal = BigDecimal.ZERO;
		BigDecimal impuesto = BigDecimal.ZERO;

		for (DetallePlanillaContratista detallePlanillaContratista : planillaContratista.getListaDetallePlanillaContratista()) {
			if (!detallePlanillaContratista.isEliminado()) {

				// Calcula totales por detalle
				BigDecimal costoTotal = detallePlanillaContratista.getCosto().multiply(detallePlanillaContratista.getCantidad());
				detallePlanillaContratista.setCostoTotal(costoTotal.setScale(2, RoundingMode.HALF_UP));

				detallePlanillaContratista.setCantidadTotal(detallePlanillaContratista.getCantidadAnterior().add(
						detallePlanillaContratista.getCantidadActual()));

				BigDecimal costoTotalActual = detallePlanillaContratista.getCostoActual().multiply(detallePlanillaContratista.getCantidadActual());
				detallePlanillaContratista.setCostoTotalActual(costoTotalActual.setScale(2, RoundingMode.HALF_UP));

				detallePlanillaContratista.setCantidadTotal(detallePlanillaContratista.getCantidadAnterior().add(
						detallePlanillaContratista.getCantidadAnterior()));
				detallePlanillaContratista.setTotal(detallePlanillaContratista.getCostoAnterior().add(detallePlanillaContratista.getCostoActual()));

				// Calula los totales por planilla
				subtotalCostoTotal = subtotalCostoTotal.add(detallePlanillaContratista.getCostoTotal());
				subtotalCostoActual = subtotalCostoActual.add(detallePlanillaContratista.getCostoActual());
				subtotalCostoAnterior = subtotalCostoAnterior.add(detallePlanillaContratista.getCostoAnterior());
				subtotal = subtotal.add(detallePlanillaContratista.getTotal());

			}

		}

		// Calcula totales a nivel de la cabecera de la planilla
		impuestoCostoTotal = (subtotalCostoTotal.multiply(porcentajeImpuesto)).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
		planillaContratista.setSubtotalCostoTotal(subtotalCostoTotal);
		planillaContratista.setImpuestoCostoTotal(impuestoCostoTotal);
		planillaContratista.setTotalCostoTotal(subtotalCostoTotal.add(impuestoCostoTotal));

		impuestoCostoActual = (subtotalCostoActual.multiply(porcentajeImpuesto)).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
		planillaContratista.setSubtotalCostoActual(subtotalCostoActual);
		planillaContratista.setImpuestoCostoActual(impuestoCostoActual);
		planillaContratista.setTotalCostoActual(subtotalCostoActual.add(impuestoCostoActual));

		impuestoCostoAnterior = (subtotalCostoAnterior.multiply(porcentajeImpuesto)).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
		planillaContratista.setSubtotalCostoAnterior(subtotalCostoAnterior);
		planillaContratista.setImpuestoCostoAnterior(impuestoCostoAnterior);
		planillaContratista.setTotalCostoAnterior(subtotalCostoAnterior.add(impuestoCostoAnterior));

		impuesto = (subtotal.multiply(porcentajeImpuesto)).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
		planillaContratista.setSubtotal(subtotal);
		planillaContratista.setImpuesto(impuesto);
		planillaContratista.setTotal(subtotal.add(impuesto));
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see ec.linde.modulos.proyectos.servicio.ServicioPlanillaContratista#cantidadPlanillaAnterior(ec.linde.persistencia.entidades.proyectos.Rdo,
	 * ec.linde.persistencia.entidades.ProdPartidaDetalle, ec.linde.persistencia.entidades.ProdConceptos)
	 */
	@Override
	public BigDecimal cantidadPlanillaAnterior(Rdo rdo, ProdPartidaDetalle partida, ProdConceptos concepto) {
		return planillaContratistaDao.cantidadPlanillaAnterior(rdo, partida, concepto);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see ec.linde.modulos.proyectos.servicio.ServicioPlanillaContratista#costoPlanillaAnterior(ec.linde.persistencia.entidades.proyectos.Rdo,
	 * ec.linde.persistencia.entidades.ProdPartidaDetalle, ec.linde.persistencia.entidades.ProdConceptos)
	 */
	@Override
	public BigDecimal costoPlanillaAnterior(Rdo rdo, ProdPartidaDetalle partida, ProdConceptos concepto) {
		return planillaContratistaDao.costoPlanillaAnterior(rdo, partida, concepto);
	}

}
